package com.tfblog.blog.controller;


import com.tfblog.blog.entity.Blog;
import com.tfblog.blog.entity.Type;
import com.tfblog.blog.service.BlogService;
import com.tfblog.blog.service.TypeService;
import com.tfblog.exception.CodeException;
import com.tfblog.utils.PageUtils;
import com.tfblog.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.lang.annotation.Target;
import java.util.List;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author tfeng
 * @since 2021-04-26
 */
@CrossOrigin
@RestController
@RequestMapping("/type")
public class TypeController {

    @Autowired
    TypeService typeService;

    @Autowired
    BlogService blogService;

    /*
    * 获取所有的分类信息
    * */
    @GetMapping("/list")
    public R findTypes() {
        List<Type> typeList = typeService.findTypes();
        return R.ok().put("data",typeList);
    }

    /*
    * 增加分类信息
    * 携带分类的名字
    * */
    @Transactional
    @PostMapping("/save")
    public R saveType(@RequestParam String name) {
        Type typeByName = typeService.findTypeByName(name);
        if (typeByName == null) {
            Type type = new Type();
            type.setName(name);
            typeService.save(type);
            return R.ok().putStatus("添加分类成功",200);
        }else {
            return R.ok().putStatus(CodeException.Duplicate_Type.getMsg(),CodeException.Duplicate_Type.getStatus());
        }
    }

    /*
    * 删除指定分类信息
    * */
    @PostMapping("/delete")
    public R deleteType(@RequestParam Long id) {
        //根据id查找对应的分类信息
        Type type = typeService.findTypeById(id);
        if (type == null) {
            return R.ok().putStatus(CodeException.NOTEXISTED_TYPE.getMsg(),CodeException.NOTEXISTED_TYPE.getStatus());
        }else {
            //分类信息存在,此时判断该分类是否挂载博客,如果有博客挂载,则不能进行删除
            List<Blog> blogs = blogService.selectBlogsByTypeId(id);
            if (blogs.size() == 0) {
                typeService.deleteTypeById(id);
                return R.ok().putStatus("分类删除成功",200);
            }else {
                return R.ok().putStatus(CodeException.EXISTED_BLOG_TYPE.getMsg(),CodeException.EXISTED_BLOG_TYPE.getStatus());
            }
        }
    }

    /*
    * 修改分类信息
    * 修改分类信息 : 此时分类一定存在于数据库中,故不需要查询是否存在
    * */
    @PostMapping("/update")
    @Transactional
    public R updateType(@RequestBody Type type) {
        //更新名字的时候,我们应该检测一下更新以后的名字是否存在:
        String name = type.getName();
        Type typeBase = typeService.findTypeByName(name);
        if (typeBase != null) {
            //说明该分类名已经存在
            return R.ok().putStatus(CodeException.Duplicate_Type.getMsg(),CodeException.Duplicate_Type.getStatus());
        }
        //否则我们执行分类修改
        typeService.updateById(type);
        return R.ok().putStatus("分类信息修改成功",200);
    }

    /*
    * 获取指定分类的博客数量
    * */
    @GetMapping("/blogcount")
    public R findBlogCountByTypeId(@RequestParam Long id) {
        int count = blogService.findBlogCountByTypeId(id);
        return R.ok().put("count",count);
    }

}

